/*
 * @Description: 全局权限验证中间件
 * @Author: Junhuang
 * @Date: 2022-02-09 16:13:50
 * @LastEditTime: 2022-03-17 00:08:27
 * @LastEditors: Junhuang
 * @Reference: 
 */
module.exports = (option, app) => {
  return async function auth(ctx, next) {
    // 1.获取token
    const { token } = ctx.header;
    if (!token) {
      let url = ''
      if (ctx.request && ctx.request.url) {
        url = ctx.request.url
      }
      //console.log(ctx.request)
      ctx.throw(400, '您没有权限访问(' + url + ')该接口!')
    }

    // 2. 根据token解密，获取用户信息
    let user = {};
    try {
      user = app.jwt.verify(token, app.config.jwt.secret)
    }
    catch (err) {
      let fail = err.name === 'TokenExpiredError' ? 'token已过期！请重新生成令牌' : 'Token令牌不正确';
      ctx.throw(400, fail);
    }

    // 3.判断当前用户是否登录
    let t = await ctx.service.cache.get('user_' + user.id);
    if (!t || t != token) {
      ctx.throw(401, 'token令牌不合法！');
    }

    // 4.查询数据库该用户是否存在，即看看该用户是否被删除了，或者其状态是否为正常
    user = await app.model.User.findByPk(user.id);
    if (!user) {
      ctx.throw(400, '用户不存在或被禁用！');
    }


    // 5.把user信息挂载到全局ctx上
    ctx.authUser = user;

    await next();

  };
};